home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / picture / dycube.c < prev    next >
Text File  |  1993-09-23  |  4KB  |  158 lines

  1. //    Copyright 1993 Ralph Gonzalez
  2.  
  3. /*
  4. *    FILE:        dycube.c
  5. *    AUTHOR:        R. Gonzalez
  6. *    CREATED:    Nov. 25, 1991
  7. *
  8. *    defines methods of Cube dynamic segment
  9. */
  10.  
  11. # include    "dycube.h"
  12. # include    "line.h"
  13. # include    "trans.h"
  14.  
  15. /******************************************************************
  16. *    initialize cube
  17. ******************************************************************/
  18. Dynamic_Cube::Dynamic_Cube(void)
  19. {
  20.     int        i;
  21.     
  22.     num_segments = 12;
  23.     
  24.     for (i=0 ; i<12 ; i++)
  25.     {
  26.         segment[i] = new Lline;
  27.         segment[i]->set_color(WHITE);
  28.     }
  29.     
  30.     ((Lline*) segment[0])->set_coord(0.,0.,0.,0.,0.,1.);
  31.     ((Lline*) segment[1])->set_coord(0.,0.,1.,0.,1.,1.);
  32.     ((Lline*) segment[2])->set_coord(0.,1.,1.,0.,1.,0.);
  33.     ((Lline*) segment[3])->set_coord(0.,1.,0.,0.,0.,0.);
  34.     ((Lline*) segment[4])->set_coord(1.,0.,0.,1.,0.,1.);
  35.     ((Lline*) segment[5])->set_coord(1.,0.,1.,1.,1.,1.);
  36.     ((Lline*) segment[6])->set_coord(1.,1.,1.,1.,1.,0.);
  37.     ((Lline*) segment[7])->set_coord(1.,1.,0.,1.,0.,0.);
  38.     ((Lline*) segment[8])->set_coord(0.,0.,0.,1.,0.,0.);
  39.     ((Lline*) segment[9])->set_coord(0.,0.,1.,1.,0.,1.);
  40.     ((Lline*) segment[10])->set_coord(0.,1.,1.,1.,1.,1.);
  41.     ((Lline*) segment[11])->set_coord(0.,1.,0.,1.,1.,0.);
  42.  
  43.     set_center(.5,.5,.5);
  44. }
  45.  
  46. /******************************************************************
  47. *    initialize fast dynamic cube
  48. ******************************************************************/
  49. Fast_Dynamic_Cube::Fast_Dynamic_Cube(void)
  50. {
  51.     int        i;
  52.     
  53.     for (i=0 ; i<8 ; i++)
  54.         c[i] = new Coord3;
  55.     
  56.     c[0]->set(0.,0.,0.);
  57.     c[1]->set(0.,0.,1.);
  58.     c[2]->set(0.,1.,1.);
  59.     c[3]->set(0.,1.,0.);
  60.     c[4]->set(1.,0.,0.);
  61.     c[5]->set(1.,0.,1.);
  62.     c[6]->set(1.,1.,1.);
  63.     c[7]->set(1.,1.,0.);
  64.     
  65.     set_color(WHITE);
  66.     
  67.     set_center(.5,.5,.5);
  68. }
  69.  
  70. /******************************************************************
  71. *    color fast dynamic cube
  72. ******************************************************************/
  73. void    Fast_Dynamic_Cube::set_color(color cube_color_val)
  74. {
  75.     cube_color = cube_color_val;
  76. }
  77.  
  78. /******************************************************************
  79. *    draw fast dynamic cube
  80. ******************************************************************/
  81. void    Fast_Dynamic_Cube::draw(Camera* camera,Projector* projector,
  82.                     Transformation* trans)
  83. {
  84.     int            i;
  85.     boolean        success = TRUE;
  86.     Coord2        *image[8];
  87.     Coord3        *new_coord;
  88.         
  89.     new_coord = new Coord3;
  90.  
  91.     for (i=0 ; i<8 ; i++)
  92.     {
  93.         image[i] = new Coord2;
  94.         new_coord->apply(c[i],trans);
  95.         if (!camera->take_photo(image[i],new_coord))
  96.             success = FALSE;
  97.     }
  98.     
  99.     if (success)
  100.     {    
  101.         projector->show_line(image[0],image[1],cube_color);
  102.         projector->show_line(image[1],image[2],cube_color);
  103.         projector->show_line(image[2],image[3],cube_color);
  104.         projector->show_line(image[3],image[0],cube_color);
  105.         projector->show_line(image[0],image[4],cube_color);
  106.         projector->show_line(image[4],image[5],cube_color);
  107.         projector->show_line(image[5],image[6],cube_color);
  108.         projector->show_line(image[6],image[7],cube_color);
  109.         projector->show_line(image[7],image[4],cube_color);
  110.         projector->show_line(image[1],image[5],cube_color);
  111.         projector->show_line(image[2],image[6],cube_color);
  112.         projector->show_line(image[3],image[7],cube_color);
  113.     }
  114.     
  115.     for (i=0 ; i<8 ; i++)
  116.         delete image[i];
  117.  
  118.     delete new_coord;
  119. }
  120.  
  121. /******************************************************************
  122. *    move dynamic cube coordinates.  Since we never use the
  123. *    Fast_Dynamic_Cube's "transformation" instance variable,
  124. *    there's no need to call inherited move() method.  But
  125. *    we must remember to move the inherited center as well.
  126. ******************************************************************/
  127. void    Fast_Dynamic_Cube::move(Transformation* trans)
  128. {
  129.     Coord3    *temp;
  130.     int        i;
  131.     
  132.     temp = new Coord3;
  133.     
  134.     for (i=0 ; i<8 ; i++)
  135.     {
  136.         temp->equate(c[i]);
  137.         c[i]->apply(temp,trans);
  138.     }
  139.  
  140.     temp->equate(center);
  141.     center->apply(temp,trans);
  142.     
  143.     delete temp;
  144. }
  145.  
  146. /******************************************************************
  147. *    destroy dynamic cube
  148. ******************************************************************/
  149. Fast_Dynamic_Cube::~Fast_Dynamic_Cube(void)
  150. {
  151.     int        i;
  152.     
  153.     for (i=0 ; i<8 ; i++)
  154.         delete c[i];
  155. }
  156.  
  157.  
  158.